// 这页代码主要处理
//1.微信服务器和自己服务器的校验，
//2.调用外部封装方法获得用户出发并由微信post来的xml数据，并转换为json格式
//3.调用获取access_token的方法，获取token
//4.调用客服消息处理方法处理客服消息业务，调用时需传入转换好的json数据、access_token

var sha1 = require('sha1')

// 导入自己封装的工具处理模块，里面封装了把xml转位js的方法
var util = require('./tools/util')

// 导入第三方收集请求流的模块
var getRawBody = require('raw-body')
var contentType = require('content-type')

// 存放appid、密钥配置的文件
var config = require('./config')
// 导入封装好的获取token的方法
var gaintoken = require('./acc_token/gaintoken') 
// 导入封装好的处理客服消息的方法
var service=require('./business/service/service')

module.exports = async (req, res, next) => {
    var token = config.wechat.token
    // console.log(req.method)

    var signature = req.query.signature
    var nonce = req.query.nonce
    var timestamp = req.query.timestamp
    var echostr = req.query.echostr

    // // 序列化排序
    var str = [token, timestamp, nonce].sort().join('')
    var sha = sha1(str)

    // 如果请求为get视为微信服务器在验证我身份
    if (req.method === 'GET') {
        // 处理服务器校验的工作
        if (sha === signature) {
            console.log('校验通过')
            res.send(echostr + '')
        } else {
            res.send('wrong')
        }
    } else if (req.method === 'POST') {
        // 请求为post则说明是用户发消息，并由微信服务器向我post

        // 这里也先验证一下身份，身份不过不让向下执行
        if (sha !== signature) {
            res.send('wrong')
            return false
        }


        //此时，微信的post请求，服务器已经可以监听到了，但获取的post数据是xml格式，需要处理 
        var data = await getRawBody(req, {
            length: req.headers['content-length'],
            limit: '1mb',
            encoding: contentType.parse(req).parameters.charset
        })

        var content = await util.parseXMLAsync(data)
        console.log(content)

        // 微信post来的xml转换为json后
        var message = util.formatMessage(content.xml)

        // console.log(message)

        // 调用在其他文件里写好的方法获取access_token，获得token后，就可以处理业务了
        gaintoken.gettoken(config).then(function(token) { 
            console.log(token)
            //执行处理客服消息的业务，这里要传入微信post来的message和token
            service.service(message,token,res)
        })

    }




}